package com.itheima.treeset_demo.comparator_demo;

import java.util.Comparator;
import java.util.TreeSet;

/*
    比较器排序 :
        1 TreeSet的带参构造方法使用的是  “比较器排序” 对元素进行排序的
        2 比较器排序，就是让TreeSet集合构造方法接收Comparator接口的实现类对象
        3 重写Comparator接口中的 compare​(T o1,T o2)方法 , 指定排序规则
        3 注意 : o1代表的是当前往集合中添加的元素 , o2代表的是集合中已经存在的元素,排序原理与自然排序相同

    排序规则 :
        1 如果返回值为负数，表示当前存入的元素是较小值，存左边
        2 如果返回值为0，表示当前存入的元素跟集合中元素重复了，不存
        3 如果返回值为正数，表示当前存入的元素是较大值，存右边

    练习：
    需求：用比较器排序方式实现下面的需求；
    要求：自定义Teacher老师类，属性为姓名和年龄
              请按照年龄排序，如果年龄一样，
              则按照姓名进行排序。姓名都使用英文字母表示


              "马尔扎哈", 30, "男"
              "迪丽热巴", 30, "女"
              "古力娜扎", 32, "女"
 */
public class ComparatorDemo {
    public static void main(String[] args) {
//        System.out.println("男".hashCode()); // 30007
//        System.out.println("女".hashCode()); // 22899
        // 创建TreeSet集合
        // TreeSet<Person> ts = new TreeSet<>(需要一个Comparator接口的实现类对象);
//        TreeSet<Person> ts = new TreeSet<>(new ComparatorImpl());

        TreeSet<Person> ts = new TreeSet<>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                // o1 : 当前添加的元素 , o2 : 集合中已经存在的元素
                // 根据年龄的升序排序
                int result = o1.getAge() - o2.getAge();
                // 如果年龄相等 , 根据性别排序 : 男 , 女
                result = (result == 0 ? -(o1.getSex().hashCode() - o2.getSex().hashCode()) : result);
                // 性别相等 , 根据名字排序 : 名字按照字母的升序
                result = result == 0 ? o1.getName().compareTo(o2.getName()) : result;
                return result;
            }
        });

        Person p1 = new Person("迪丽热巴", 30, "女");
        Person p2 = new Person("古力娜扎", 32, "女");
        Person p3 = new Person("古力娜扎", 32, "女");
        Person p4 = new Person("马尔扎哈", 30, "男");

        ts.add(p1);
        ts.add(p2);
        ts.add(p3);
        ts.add(p4);

        // 遍历集合
        for (Person person : ts) {
            System.out.println(person);
        }
    }
}
//
//// Comparator的实现类
//class ComparatorImpl implements Comparator<Person> {
//    /*
//        Person p1 = new Person("迪丽热巴" , 30 , "男");
//        Person p1 = new Person("迪丽热巴" , 30 , "女");
//
//
//        -(30007 - 22899)
//
//     */
//    @Override
//    public int compare(Person o1, Person o2) {
//        // o1 : 当前添加的元素 , o2 : 集合中已经存在的元素
//        // 根据年龄的升序排序
//        int result = o1.getAge() - o2.getAge();
//        // 如果年龄相等 , 根据性别排序 : 男 , 女
//        result = (result == 0 ? -(o1.getSex().hashCode() - o2.getSex().hashCode()) : result);
//        // 性别相等 , 根据名字排序 : 名字按照字母的升序
//        result = result == 0 ? o1.getName().compareTo(o2.getName()) : result;
//        return result;
//    }
//}
//
